from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.shortcuts import get_object_or_404
from django.db.models import Q, Avg
from django.utils import timezone
import time
import random
import re

from ..models import ChatSession, ChatMessage, AIKnowledgeBase, UserFeedback
from ..serializers.ai_assistant import (
    ChatSessionSerializer, ChatMessageSerializer, 
    AIKnowledgeBaseSerializer, UserFeedbackSerializer
)
from ..authentication import CsrfExemptSessionAuthentication
from ..quick_responses import get_recovery_timeline, get_weight_gain_advice, get_relapse_prevention


class AIAssistantViewSet(viewsets.ViewSet):
    """AI助手API视图集"""
    authentication_classes = [CsrfExemptSessionAuthentication]
    permission_classes = [IsAuthenticated]

    @action(detail=False, methods=['post'], url_path='chat')
    def chat(self, request):
        """发送消息给AI助手"""
        try:
            message_content = request.data.get('message', '')
            feature = request.data.get('feature', 'general')
            context = request.data.get('context', [])
            
            if not message_content.strip():
                return Response({
                    'error': '消息内容不能为空'
                }, status=status.HTTP_400_BAD_REQUEST)
            
            # 获取或创建会话
            session = self._get_or_create_session(request.user, message_content, feature)
            
            # 保存用户消息
            user_message = ChatMessage.objects.create(
                session=session,
                message_type='user',
                content=message_content,
                feature=feature
            )
            
            # 生成AI回复
            start_time = time.time()
            ai_response = self._generate_ai_response(message_content, feature, context)
            response_time = time.time() - start_time
            
            # 保存AI回复
            ai_message = ChatMessage.objects.create(
                session=session,
                message_type='ai',
                content=ai_response,
                feature=feature,
                response_time=response_time,
                confidence_score=0.8  # 模拟置信度
            )
            
            # 更新会话时间
            session.updated_at = timezone.now()
            session.save()
            
            return Response({
                'message': ai_response,
                'session_id': session.id,
                'response_time': response_time
            })
            
        except Exception as e:
            return Response({
                'error': f'处理消息时发生错误: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    @action(detail=False, methods=['get'], url_path='history')
    def history(self, request):
        """获取对话历史"""
        try:
            sessions = ChatSession.objects.filter(
                user=request.user,
                is_active=True
            ).order_by('-updated_at')[:20]  # 最近20个会话
            
            serializer = ChatSessionSerializer(sessions, many=True)
            return Response({
                'results': serializer.data
            })
            
        except Exception as e:
            return Response({
                'error': f'获取历史记录失败: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    @action(detail=True, methods=['get'])
    def session(self, request, pk=None):
        """获取特定会话的消息"""
        try:
            session = get_object_or_404(
                ChatSession, 
                id=pk, 
                user=request.user
            )
            
            messages = ChatMessage.objects.filter(
                session=session
            ).order_by('created_at')
            
            message_data = []
            for msg in messages:
                message_data.append({
                    'type': msg.message_type,
                    'content': msg.content,
                    'timestamp': msg.created_at,
                    'liked': msg.is_helpful
                })
            
            return Response({
                'session': ChatSessionSerializer(session).data,
                'messages': message_data
            })
            
        except Exception as e:
            return Response({
                'error': f'获取会话失败: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    @action(detail=False, methods=['post'], url_path='save')
    def save(self, request):
        """保存对话消息（兼容前端API调用）"""
        # 这个接口主要是为了兼容前端的saveChatMessage调用
        return Response({'status': 'saved'})

    @action(detail=False, methods=['get'], url_path='knowledge')
    def knowledge(self, request):
        """搜索知识库"""
        try:
            query = request.GET.get('q', '')
            if not query:
                return Response({
                    'results': []
                })
            
            # 搜索知识库
            knowledge_items = AIKnowledgeBase.objects.filter(
                Q(title__icontains=query) |
                Q(content__icontains=query) |
                Q(keywords__icontains=query),
                is_active=True
            ).order_by('-priority')[:10]
            
            serializer = AIKnowledgeBaseSerializer(knowledge_items, many=True)
            return Response({
                'results': serializer.data
            })
            
        except Exception as e:
            return Response({
                'error': f'搜索知识库失败: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    @action(detail=False, methods=['post'], url_path='rate')
    def rate(self, request, pk=None):
        """评价AI回复"""
        try:
            message_id = request.data.get('message_id')
            rating = request.data.get('rating')
            comment = request.data.get('comment', '')
            
            message = get_object_or_404(ChatMessage, id=message_id)
            
            feedback, created = UserFeedback.objects.get_or_create(
                user=request.user,
                message=message,
                defaults={
                    'rating': rating,
                    'comment': comment
                }
            )
            
            if not created:
                feedback.rating = rating
                feedback.comment = comment
                feedback.save()
            
            # 更新消息的有用性标记
            message.is_helpful = rating >= 4
            message.save()
            
            return Response({'status': 'rated'})
            
        except Exception as e:
            return Response({
                'error': f'评价失败: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    @action(detail=False, methods=['get'], url_path='stats')
    def stats(self, request):
        """获取AI助手统计信息"""
        try:
            user_sessions = ChatSession.objects.filter(user=request.user)
            user_messages = ChatMessage.objects.filter(session__user=request.user)
            
            stats = {
                'total_sessions': user_sessions.count(),
                'total_messages': user_messages.count(),
                'avg_response_time': user_messages.filter(
                    message_type='ai',
                    response_time__isnull=False
                ).aggregate(avg_time=Avg('response_time'))['avg_time'] or 0,
                'helpful_responses': user_messages.filter(
                    message_type='ai',
                    is_helpful=True
                ).count()
            }
            
            return Response(stats)
            
        except Exception as e:
            return Response({
                'error': f'获取统计信息失败: {str(e)}'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    def _get_or_create_session(self, user, message, feature):
        """获取或创建对话会话"""
        # 查找最近的活跃会话
        recent_session = ChatSession.objects.filter(
            user=user,
            is_active=True
        ).order_by('-updated_at').first()
        
        # 如果最近的会话是在30分钟内创建的，则复用
        if recent_session and (timezone.now() - recent_session.updated_at).seconds < 1800:
            return recent_session
        
        # 创建新会话
        title = self._generate_session_title(message, feature)
        return ChatSession.objects.create(
            user=user,
            title=title
        )

    def _generate_session_title(self, message, feature):
        """生成会话标题"""
        feature_titles = {
            'consult': '戒烟咨询',
            'craving': '烟瘾应对',
            'mood': '情感支持',
            'health': '健康问答',
            'general': '对话咨询'
        }
        
        base_title = feature_titles.get(feature, '对话咨询')
        
        # 简化消息内容作为标题
        if len(message) <= 20:
            return f"{base_title} - {message}"
        else:
            return f"{base_title} - {message[:20]}..."

    def _generate_ai_response(self, message, feature, context):
        """生成AI回复（模拟智能回复）"""
        
        # 首先检查是否是快速问题
        quick_response = self._get_quick_question_response(message)
        if quick_response:
            return quick_response
        
        # 基于功能类型的回复模板
        feature_responses = {
            'consult': self._get_consult_response(message),
            'craving': self._get_craving_response(message),
            'mood': self._get_mood_response(message),
            'health': self._get_health_response(message),
            'general': self._get_general_response(message)
        }
        
        return feature_responses.get(feature, self._get_general_response(message))

    def _get_consult_response(self, message):
        """戒烟咨询回复"""
        responses = [
            "戒烟是一个过程，需要耐心和坚持。建议您：\n\n1. **制定明确的戒烟计划**：设定具体的戒烟日期\n2. **寻找替代活动**：当想吸烟时，可以喝水、散步或深呼吸\n3. **获得支持**：告诉家人朋友您的戒烟决定\n4. **奖励自己**：为每个戒烟里程碑设置奖励\n\n记住，每一天的坚持都是胜利！您已经迈出了重要的第一步。",
            
            "很高兴您选择戒烟！这是对健康最好的投资。根据经验，成功戒烟的关键包括：\n\n• **心理准备**：明确戒烟的原因和好处\n• **行为改变**：避开吸烟触发场景\n• **寻求帮助**：可以考虑戒烟贴、口香糖等辅助产品\n• **保持积极**：即使偶有失败也不要放弃\n\n您现在最想了解戒烟的哪个方面呢？",
            
            "戒烟确实不容易，但绝对值得！让我为您分享一些实用建议：\n\n**前期准备**：\n- 清理所有烟草用品\n- 告知身边人您的戒烟计划\n- 准备应对烟瘾的策略\n\n**应对策略**：\n- 深呼吸练习\n- 转移注意力\n- 适量运动\n- 多喝水\n\n坚持就是胜利，我会一直支持您！"
        ]
        return random.choice(responses)

    def _get_craving_response(self, message):
        """烟瘾应对回复"""
        responses = [
            "我理解您现在的感受，烟瘾确实很难受。请试试这些立即有效的方法：\n\n🌸 **深呼吸法**：缓慢吸气4秒，屏住4秒，呼气4秒\n💧 **喝水**：大口喝一杯温水\n🚶 **活动身体**：原地走动或做几个深蹲\n🧠 **转移注意力**：数数、听音乐或打电话给朋友\n\n记住：烟瘾通常只持续3-5分钟，您可以挺过去的！每次成功抵御都让您更强大。",
            
            "烟瘾来袭时很不舒服，但这说明您的身体正在康复！立即尝试：\n\n**4个快速应对法**：\n1. **漱口**：用薄荷味漱口水\n2. **嚼东西**：口香糖、胡萝卜条、牙签\n3. **按摩**：揉搓耳朵或按压太阳穴\n4. **正向思维**：想想戒烟的好处\n\n这种感觉会过去的，您已经很勇敢了！",
            
            "现在正是考验意志力的时候！我来帮您度过这个难关：\n\n⏰ **立即行动**：\n- 离开当前环境\n- 用冷水洗脸\n- 吃一颗薄荷糖\n- 握紧拳头10秒再放松\n\n💪 **心理暗示**：\n\"我选择健康，我可以控制自己\"\n\"这种感觉会过去，我比烟瘾更强\"\n\n您正在创造奇迹，坚持住！"
        ]
        return random.choice(responses)

    def _get_mood_response(self, message):
        """情感支持回复"""
        responses = [
            "我能感受到您内心的挣扎，戒烟过程中出现情绪波动是完全正常的。请记住：\n\n❤️ **您并不孤单**：成千上万的人都经历过同样的过程\n🌱 **这是成长**：每个困难都在让您变得更强\n🎯 **专注目标**：想想戒烟后的美好生活\n💝 **善待自己**：给自己一些温柔和耐心\n\n情绪低落时，试试：听音乐、散步、与朋友聊天、或者写下您的感受。您正在做一件伟大的事情！",
            
            "戒烟路上的情绪起伏我完全理解。让我们一起面对这些挑战：\n\n🤗 **接纳情绪**：允许自己有各种感受\n🌞 **积极关注**：每天记录一件戒烟带来的好处\n🏃 **释放压力**：运动是最好的情绪调节器\n😊 **寻找快乐**：做一些让您开心的小事\n\n记住，您选择戒烟是因为您值得更好的生活。我相信您一定可以成功！",
            
            "您的感受我都理解，戒烟不仅是身体的挑战，更是心理的考验。现在让我们来调整心情：\n\n🧘 **冥想练习**：找个安静地方，专注呼吸5分钟\n📝 **情感日记**：写下今天的感受和收获\n🎵 **音乐疗愈**：听一些轻松愉快的音乐\n☀️ **阳光沐浴**：到户外晒晒太阳\n\n您已经很勇敢了，相信自己，一切都会好起来的！"
        ]
        return random.choice(responses)

    def _get_health_response(self, message):
        """健康问答回复"""
        responses = [
            "关于戒烟的健康益处，我很乐意为您解答：\n\n⏰ **戒烟后身体变化时间表**：\n• 20分钟：心率和血压下降\n• 12小时：血液中一氧化碳水平恢复正常\n• 2-12周：循环系统改善，肺功能增强\n• 1-9个月：咳嗽和呼吸急促减少\n• 1年：冠心病风险降低50%\n• 5年：中风风险降至与非吸烟者相同\n\n您的身体正在发生积极变化，坚持下去！",
            
            "戒烟对健康的好处是全方面的：\n\n🫁 **呼吸系统**：肺功能改善，减少咳嗽和痰液\n❤️ **心血管系统**：降低心脏病和中风风险\n🦷 **口腔健康**：减少牙龈疾病，口气更清新\n👃 **感官恢复**：嗅觉和味觉变得更敏感\n💪 **体力增强**：运动耐力显著提升\n💰 **经济效益**：节省大量烟草开支\n\n每一天的坚持都在为您的健康加分！",
            
            "让我为您介绍戒烟后的健康改善：\n\n📊 **短期效果**（1-30天）：\n- 睡眠质量改善\n- 皮肤状态变好\n- 精力更充沛\n- 免疫力增强\n\n📈 **长期效果**（1年以上）：\n- 癌症风险大幅降低\n- 心肺功能显著改善\n- 生育能力提升\n- 预期寿命延长\n\n您正在为自己的健康投资，这是最明智的选择！"
        ]
        return random.choice(responses)

    def _get_general_response(self, message):
        """通用回复"""
        # 简单的关键词匹配
        if any(word in message.lower() for word in ['help', '帮助', '怎么办', '如何']):
            return "我很乐意帮助您！作为您的AI戒烟助手，我可以为您提供：\n\n🎯 个性化戒烟建议\n🚨 烟瘾应对策略\n❤️ 心理支持和鼓励\n📚 健康知识解答\n📊 进度分析和激励\n\n请告诉我您现在最需要什么帮助？"
        
        elif any(word in message.lower() for word in ['谢谢', 'thank', '感谢']):
            return "不用客气！能够帮助您戒烟是我的荣幸。记住，戒烟路上您并不孤单，我会一直陪伴和支持您。有任何问题随时告诉我！💪"
        
        elif any(word in message.lower() for word in ['难', '困难', '坚持不住']):
            return "我理解您现在的困难，戒烟确实不容易，但请记住：\n\n✨ **您已经很棒了**：选择戒烟就是成功的开始\n💪 **困难是暂时的**：每次挑战都让您更强大\n🎯 **专注当下**：一次只关注度过今天\n🌈 **美好在前方**：健康的生活正在等着您\n\n相信自己，您一定可以做到！需要具体帮助时随时告诉我。"
        
        else:
            return "感谢您与我分享。作为您的戒烟助手，我理解戒烟过程中的各种挑战。\n\n无论您遇到什么困难，请记住：\n• 戒烟是一个过程，不是一次性的事件\n• 每一小步都值得庆祝\n• 寻求帮助是勇敢的表现\n• 我会一直支持您\n\n您想聊聊现在的感受吗？或者需要什么具体的建议？"

    def _get_quick_question_response(self, message):
        """为快速问题提供专门的回复"""
        message_lower = message.strip()
        
        # 检查是否匹配快速问题
        if '刚开始戒烟' in message_lower or ('刚' in message_lower and '戒烟' in message_lower and '建议' in message_lower):
            return self._get_beginner_quit_advice()
        
        elif '烟瘾很强' in message_lower or '烟瘾怎么办' in message_lower:
            return self._get_strong_craving_help()
        
        elif '戒烟多久' in message_lower and ('身体' in message_lower or '恢复' in message_lower):
            return self._get_recovery_timeline()
        
        elif '戒烟后' in message_lower and ('体重' in message_lower or '增加' in message_lower):
            return self._get_weight_gain_advice()
        
        elif '如何避免复吸' in message_lower or '避免复吸' in message_lower:
            return self._get_relapse_prevention()
        
        return None  # 不匹配快速问题，返回none

    def _get_beginner_quit_advice(self):
        """刚开始戒烟的建议"""
        return """🎉 **恐喜您开始戒烟之旅！**

作为刚开始戒烟的新手，这里有一些非常实用的建议：

📝 **第一周的准备工作**：
• 设定明确的戒烟日期
• 清理所有烟草用品（烟、打火机、烟灰缸）
• 告诉家人朋友您的戒烟计划
• 准备替代品（口香糖、牙签、健康零食）

🎯 **前3天是关键**：
• 多喝水，帮助排毒
• 避免吸烟触发场所
• 保持手部忙碌
• 早睡早起，规律作息

💪 **应对初期不适**：
• 焦虑烦躁：正常现象，1-2周后缓解
• 注意力不集中：做些简单的事情
• 食欲增加：准备健康零食

🌱 **每日励志**：
"今天我选择健康，明天我会更强大！"

记住，每一个成功的戒烟者都是从第一天开始的。您已经踏出了最重要的一步！"""

    def _get_strong_craving_help(self):
        """强烈烟瘾的应对方法"""
        return """🆘 **紧急烟瘾应对指南**

我理解您现在的烟瘾很强烈，这就像一阵风暴，但是会过去的！

🚑 **立即行动（现在就做）**：
1️⃣ **深呼吸法**：缓慢吸气4秒 → 屏住4秒 → 呼气4秒
2️⃣ **冷水激击**：喝一大杯冰水或用冷水洗脸
3️⃣ **离开现场**：立即离开当前位置，去另一个房间
4️⃣ **手部占用**：紧握双拳10秒，然后放松

🌿 **5分钟缓解法**：
• 听一首喋嘣音乐（推荐轻音乐）
• 做些简单运动：俯卧撑、跳跃
• 按摩太阳穴或耳垂
• 嚐口香糖或吃酷酸糖

🧠 **心理暗示**：
"这种感觉只会持续3-5分钟"
"我比烟瘾更强大"
"每次抗拒都让我更健康"

记住：烟瘾是暂时的，但您的决心是永恒的！💪"""

    def _get_recovery_timeline(self):
        """戒烟后身体恢复时间表"""
        return get_recovery_timeline()

    def _get_weight_gain_advice(self):
        """戒烟后体重增加的建议"""
        return get_weight_gain_advice()

    def _get_relapse_prevention(self):
        """预防复吸的策略"""
        return get_relapse_prevention()